class Solution {
public:
vector<int> findRightInterval(vector<vector<int>>& intervals) {
vector<int> ans;
vector<int> starts;
unordered_map<int,int> map; //hash table
for(int i = 0; i< intervals.size(); i++){
map[intervals[i][0]] = i; // key: start_i, value: i (index),
starts.push_back(intervals[i][0]);
}
sort(starts.begin(), starts.end());
for(int i = 0; i< intervals.size(); i++){
auto search_res = upper_bound(starts.begin(), starts.end(), intervals[i][1] - 1);
if(search_res == starts.end()){
ans.push_back(-1);
}
else{
ans.push_back(map[*search_res]);
}
}
return ans;
}
};
後來想到C++ STL中 map底層是用red-black tree實現的,所以使用它來儲存key-value pair會保持有序,與底層用hash table實現的unordered_map不同,所以本身也就有提供upper_bound與lower_bound。所以也附上來。
另外你問我結果怎看起來差不多,是因為我跑很多次取好看的哈哈,map理論上比較穩定O(lgn),unordered_map則時快時慢,因為hash table有可能從O(1)變O(n),但好像有點吃leetcode測資,map有時也會很慢,我猜是做了很大量的平衡。 反正那個數字就參考參考。
class Solution {
public:
vector<int> findRightInterval(vector<vector<int>>& intervals) {
vector<int> ans;
map<int,int> map;
for(int i = 0; i< intervals.size(); i++){
map[intervals[i][0]] = i;
}
for(int i = 0; i< intervals.size(); i++){
auto search_res = map.lower_bound(intervals[i][1]);
if(search_res == map.end()){
ans.push_back(-1);
}
else{
ans.push_back(search_res->second);
}
}
return ans;
}
};